/** person information */
// interface User {
//   name: string;
//   age: number;
//   sex: 'male' | 'female';
// }

// const p: User = {
//   name: 'zhangsan',
//   age: 18,
//   sex: 'male'
// }

// console.log(p)

// type _Extract<T, U> = T extends U ? T : never

// interface Worker {
//   name: string;
//   age: number;
//   email: string;
//   salary: number
// }

// interface Student {
//   name: string;
//   age: number;
//   email: string;
//   grade: number
// }

// // type CommonKeys = _Extract<keyof Worker, keyof Student>
// // type CommonKeys = Exclude<keyof Worker, keyof Student>
// type newWorker = Partial<Worker>
// type newStudent = Required<Student>
// type pickerName = Pick<Student, 'name' | 'age'>
// type omitName = Omit<Student, 'name' | 'age'>

// function push(array: any[], ...items: any[]) {
//   items.forEach(function (item) {
//     array.push(item)
//   })
// }

// let a_test: any[] = []

// push(a_test, 1, 2, 3)

// console.log(a_test)

// function reverse(x: number): number;
// function reverse(x: string): string;
// function reverse(x: number | string): number | string | void {
//   if (typeof x === 'number') {
//     return Number(x.toString().split('').reverse().join(''));
//   } else if (typeof x === 'string') {
//     return x.split('').reverse().join('');
//   }
// }

// const res_number = reverse(12345)
// const res_string = reverse('hello_olleh')
// console.log(res_number)
// console.log(res_string)

// public/private/protected
// public 修饰的属性或方法都是公有的，可以在任何地方被访问到，也是默认值
// private 修饰的属性和方法都是私有的，只能在声明他的类中被访问
// protected 修饰的属性和方法是受保护的，子类可以访问

// 当构造函数修饰为private时，该类不允许被继承和实例化

// 当构造函数修饰为protected时，该类只允许被继承

// 类实现接口
// interface Alarm {
//   alert(): void;
// }

// class Door { }

// class SecurityDoor extends Door implements Alarm {
//   alert() {
//     console.log('SecurityDoor alert')
//   }
// }

// class Car implements Alarm {
//   alert() {
//     console.log('Car alert')
//   }
// }

// interface Alarm {
//   alert(): void;
// }

// interface Light {
//   lightOn(): void;
//   lightOff(): void;
// }

// interface LightableAlarm extends Alarm {
//   lightOn(): void;
//   lightOff(): void;
// }

// class Car implements LightableAlarm {
//   alert() {
//     console.log('Car alert');
//   }
//   lightOn() {
//     console.log('Car light on');
//   }
//   lightOff() {
//     console.log('Car light off');
//   }
// }

function swap<T, U>(tuple: [T, U]): [U, T] {
  return [tuple[1], tuple[0]];
}

swap(['1', 2])